package com.example.mvvmdemo.utils;

import android.content.Context;

import com.tencent.mmkv.MMKV;

import java.util.Map;
import java.util.Set;

/**
 * MMKV工具类
 */
public class MmkvUtil {
    private static MmkvUtil instance;
    private MMKV mmkv;

    private MmkvUtil() {
        mmkv = MMKV.defaultMMKV();
    }
    //不同业务需要区别存储，也可以单独创建自己的实例
/*
    private MmkvUtil(String id){
        mmkv = MMKV.mmkvWithID(id);
    }
*/
    /**
     * 初始化MMKV
     * 在Application中初始化MMKV———————MmkvUtils.initialize(this);
     */
    public static void initialize(Context context){
        MMKV.initialize(context);
    }

    /**
     * 获取MMKV实例
     * @return {@link MmkvUtil}
     */
    public static synchronized MmkvUtil getInstance(){
        if(instance == null){
            instance = new MmkvUtil();
        }
        return instance;
    }

    /**
     * 存入数据int
     * @param key   键
     * @param value 值
     */
    public void putInt(String key, int value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据long
     * @param key   键
     * @param value 值
     */
    public void putLong(String key, long value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据float
     * @param key   键
     * @param value 值
     */
    public void putFloat(String key, float value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据byte[]
     * @param key   键
     * @param value 值
     */
    public void putByte(String key, byte[] value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据double
     * @param key   键
     * @param value 值
     */
    public void putDouble(String key, double value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据boolean
     * @param key   键
     * @param value 值
     */
    public void putBoolean(String key, boolean value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据String
     * @param key   键
     * @param value 值
     */
    public void putString(String key, String value){
        mmkv.encode(key, value);
    }

    /**
     * 存入数据Set<String>
     * @param key   键
     * @param value 值
     */
    public void putSet(String key, Set<String> value){
        mmkv.encode(key, value);
    }

    /**
     * 获取key对应int的值
     * @param key   键
     * @return int
     */
    public int getInt(String key){
        return mmkv.decodeInt(key);
    }

    /**
     * 获取key对应long的值
     * @param key   键
     * @return long
     */
    public long getLong(String key){
        return mmkv.decodeLong(key);
    }

    /**
     * 获取key对应float的值
     * @param key   键
     * @return float
     */
    public float getFloat(String key){
        return mmkv.decodeFloat(key);
    }

    /**
     * 获取key对应byte[]的值
     * @param key   键
     * @return byte[]
     */
    public byte[] getByte(String key){
        return mmkv.decodeBytes(key);
    }

    /**
     * 获取key对应double的值
     * @param key   键
     * @return double
     */
    public double getDouble(String key){
        return mmkv.decodeDouble(key);
    }

    /**
     * 获取key对应boolean的值
     * @param key   键
     * @return boolean
     */
    public boolean getBoolean(String key){
        return mmkv.decodeBool(key);
    }

    /**
     * 获取key对应String的值
     * @param key   键
     * @return String
     */
    public String getString(String key){
        return mmkv.decodeString(key);
    }

    /**
     * 获取key对应Set<String>的值
     * @param key   键
     * @return Set<String>
     */
    public Set<String> getSet(String key){
        return mmkv.decodeStringSet(key);
    }

    /**
     * 获取所有key
     * @return String[]
     */
    public String[] getAllKeys(){
        return mmkv.allKeys();
    }

    /**
     * 获取所有的键值对
     * @return Map<String, ?>
     */
    public Map<String, ?> getAll(){
        return mmkv.getAll();
    }

    /**
     * 查询某个key是否已经存在
     * @param key   键
     * @return true: 存在<br>false: 不存在
     */
    public boolean containsKey(String key){
        return mmkv.containsKey(key);
    }

    /**
     * 移除指定的key
     * @param key   键
     */
    public void removeKey(String key){
        mmkv.removeValueForKey(key);
    }

    /**
     * 移除一组key
     * @param keys  一组键
     */
    public void removeKeys(String[] keys){
        mmkv.removeValuesForKeys(keys);
    }

    /**
     * 清除所有key
     */
    public void clearAll(){
        mmkv.clearAll();
    }

}
